package org.swimv2.servlets;

import java.io.IOException;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.swimv2.entities.User;
import org.swimv2.interfaces.AccessManagerRemote;
import org.swimv2.utils.ContextUtil;

/**
 * Gestisce la registrazione degli utenti.
 * 
 * @author Lorenzo Delledonne
 */
public class SignUpServlet extends HttpServlet {

	private static final long serialVersionUID = -1604501144172458859L;

	/**
     * @see HttpServlet#HttpServlet()
     */
    public SignUpServlet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request .setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		
		String par_first  = request.getParameter("firstName");
		String par_last   = request.getParameter("lastName");
		String par_email  = request.getParameter("email");
		String par_place  = request.getParameter("place");
		String par_passw1 = request.getParameter("password_1");
		String par_passw2 = request.getParameter("password_2");
		String par_type   = request.getParameter("type");
		
		try {
			RequestDispatcher 	disp;
			Context 			ctx = ContextUtil.getInitialContext();
			AccessManagerRemote mgr = (AccessManagerRemote) ctx.lookup("AccessManagerJNDI");
			
			/* Campi non validi. */
			if (par_first  == null || par_last   == null ||
				par_email  == null || par_place  == null ||
				par_passw1 == null || par_passw2 == null) {
				// Redirect con messaggio di errore
				request.setAttribute("error_message", "Errore nella compilazione del form di iscrizione:<br/>Compilare tutti i campi!");
				disp = request.getRequestDispatcher("access/signup.jsp");
				disp.forward(request, response);
				return;
			}
			
			/* Le due password inserite non coincidono. */
			if (!par_passw1.equals(par_passw2)) {
				request.setAttribute("error_message", "Errore nella compilazione del form di iscrizione:<br/>La password non coincide con quella di conferma!");
				disp = request.getRequestDispatcher("access/signup.jsp");
				disp.forward(request, response);
				return;
			}
			
			boolean admin = false;
			if (par_type != null && par_type.equals("admin"))
				admin = true;
			
			/* Tenta la creazione di un nuovo utente. */
			User u = new User();
			u.setFirstName(par_first);
			u.setLastName(par_last);
			u.setEMail(par_email);
			u.setIsAdmin(admin);
			u.setPassword(par_passw1);
			u.setPlace(par_place);
			
			// Utente creato correttamente
			if (mgr.createUser(u)) {
				request.getSession().setAttribute("user", mgr.validate_login(par_email, par_passw1));
				request.setAttribute("message", "Registrazione effettuata correttamente!");
				disp = request.getRequestDispatcher("user/profile.jsp");
			// Impossibile creare utente
			} else {
				request.setAttribute("error_message", "Si &egrave; verificato un errore nella creazione dell'utente. (Gi&agrave; presente?)");
				disp = request.getRequestDispatcher("access/signup.jsp");
			}
			disp.forward(request, response);
			
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}

}
